// Import some needed classes
import sun.net.*;

import java.io.IOException;
import java.net.*;


public class Atendedor {

	private final String IP_0 = "192.168.32.33";
	private final String IP_1 = "192.168.32.33";
	private final String IP_2 = "192.168.32.33";
	
	private final String IP_3 = "192.168.32.30";
	private final String IP_4 = "192.168.32.33";
	
	private final String IP_5 = "192.168.32.33";
	
	//	 En que puerto escucharemos
	private int puertoGrupo = 5000;
	//	 direccion del grupo azul
	private String grupoAzul = "225.4.5.6";
//	 direccion del grupo rojo
	private String grupoRojo = "225.4.5.6";
	
	
	public void responderPedidoAyuda(String direccionPedido, int puertoPedido) {
		try {
			// Crea su socket  
			DatagramSocket socketPP = new DatagramSocket();  
	 
			// Construye la dirección del socket del receptor  
			InetAddress maquina = InetAddress.getByName(direccionPedido);    
	 
		    // Crea el primer mensaje
		    String arg = "hola";
		    byte [] cadena = arg.getBytes();  
		    DatagramPacket mensaje = new DatagramPacket(cadena,  
		                                arg.length(), maquina, puertoPedido);  
		 
		    // Envía el primer mensaje  
		    socketPP.send(mensaje);
		} catch(IOException e) {
			
		}
	}

	public void recibirPedidosAyuda() {
		// Creamos el socket multicast y hacemos el bind
		MulticastSocket socketGrupo = null;;
		try {
			socketGrupo = new MulticastSocket(puertoGrupo);
			// Joineamos al grupo multicast
			socketGrupo.joinGroup(InetAddress.getByName(grupoAzul));
			// Aca el socket esta levantado y podemos recibir paquetes
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			System.err.println("Error al crear el socket");
		};
		
		
		while(true) {	
				
				// Creamos un DatagramPacket y hacemos un receive
				byte buf[] = new byte[1024];
				DatagramPacket pack = new DatagramPacket(buf, buf.length);
				try {
					socketGrupo.receive(pack);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					System.err.println("Error al recibir el paquete");
				}
				
				String direccionPedido = pack.getAddress().toString();
				int puertoPedido = pack.getPort(); 
				// Imprimimos algo en la pantalla
				System.out.println("Received data from: " + direccionPedido +
						    ":" + puertoPedido + " with length: " +
						    pack.getLength());
				System.out.write(pack.getData(),0,pack.getLength());
				System.out.println();
			
				// Respondemos con un mensaje de respuesta a la solicitud de ayuda 
				
				responderPedidoAyuda(direccionPedido, puertoPedido);
			 
				// Dejamos el grupo
			    try {
					socketGrupo.leaveGroup(InetAddress.getByName(grupoAzul));
				} catch (UnknownHostException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					System.err.println("Error al dejar el grupo");
				}
				// cerramos el socket
			    socketGrupo.close();
				
		}
	}
	
	void enviarPedidoAyuda() {
	      
		// ttl
		int ttl = 1;
		
		// Creamo el socket pero no realizamos el bind porque vamos a enviar datos
		MulticastSocket s = null;
		
		try {
			s = new MulticastSocket();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.err.println("Error al crear el multicast socket");
		}
		
		//No debemos realizar un join al grupo si solo vamos a enviar datos

	    // Llenamos el buffer
	    byte buf[] = new byte[10];
	    
		for (int i=0; i<buf.length; i++) buf[i] = (byte)i;
		
		// Creamos un DatagramPacket 
		DatagramPacket pack = null;
		try {
			pack = new DatagramPacket(buf, buf.length,
			  					 InetAddress.getByName(grupoAzul), puertoGrupo);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.err.println("Error al crear el Datagram Socket");
		}
		
		// Realizamos el send. Note that send takes a byte for the ttl and not an int.
		try {
			s.send(pack,(byte)ttl);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.err.println("Error al realizar el send");
		}
		
		// Cerramos el socket cuando terminamos
		s.close();

	}
	
	public void main(String[] args) {
		
		recibirPedidosAyuda();
		
	}

}
